#include "stack.h"


// 栈的初始化
int Init_Stack(SqStack ** S)
{
    * S = (SqStack * )malloc(sizeof(SqStack));
    if ( NULL == *S )
    {
        ERRLOG("动态空间创建失败");
        exit(EOF);
    }

    memset( (*S)->data , 0 , sizeof(Elenemt_data) * MAX_SIZE ); 

    (*S)->top = -1;
    // -1 空栈   top  == -1
    return 0;
}



// 栈的进栈
int Push_Stack(SqStack * S, Elenemt_data data)
{
    if (NULL == S)
    {
        ERRLOG("传入的栈 为 null");
        return EOF;
    }
    if (MAX_SIZE == S->top)
    {
        ERRLOG("栈 为 满");
        return EOF;
    }

    S->top++;

    S->data[S->top] = data;

    return 0;
}




// 栈的出栈
int Pop_Stack(SqStack * S)
{
    if (NULL == S)
    {
        ERRLOG("传入的栈 为 null");
        return EOF;
    }

    if (EOF == S->top)
    {
        ERRLOG("栈 为 空");
        return EOF;
    }

    memset( &S->data[S->top] , 0 , sizeof(Elenemt_data));

    S->top--;

    return 0;
}



// 栈的读取    只读取栈顶部
int Get_Top(SqStack * S, Elenemt_data * data)
{
    if (NULL == S)
    {
        ERRLOG("传入的栈 为 null");
        return EOF;
    }

    if (EOF == S->top)
    {
        ERRLOG("栈 为 空");
        return EOF;
    }

    // 如果 data 传入的为 NULL则打印当前数据
    if (NULL == data)
    {
        printf("%s\t%s\t%d\t%d\t%d\n", \
               S->data[S->top].name, S->data[S->top].sex, S->data[S->top].age, \
               S->data[S->top].id, S->data[S->top].sco);
    }

    else
    {
        *data = S->data[S->top];
    }

    return 0;
    
}

// 栈的判空    
int Is_Empty(SqStack * S)
{
    if (NULL == S)
    {
        ERRLOG("传入的栈 为 null");
        return EOF;
    }

    if (-1 == S->top)
    {
        // 无数据返回0
        return 0;
    }

    // 有数据 返回非0
    return EOF;
}

// 栈的清空 
int Clear_Stack(SqStack * S)
{
    if (NULL == S)
    {
        ERRLOG("传入的栈 为 null");
        return EOF;
    }
    S->top = -1;

    return 0;
}



// 栈的销毁
int Destroy_Stack(SqStack ** S)
{
    if (NULL == *S)
    {
        ERRLOG("传入的栈 为 null")
        return EOF;
    }

    free(*S);

    *S = NULL;
    
    return 0;
}